// passport
const passport = require("passport");
// 本地策略
const LocalStrategy = require("passport-local").Strategy;
// 策略
const Strategy = require("passport-http-bearer").Strategy;

var jwt = require("jsonwebtoken");

var _ = require("lodash");

var jwt_config = require("config").get("jwt_config");

// 通过登录函数初始化
/**
 * 初始化 passport 框架
 *
 * @param  {[type]}   app       全局应用程序
 * @param  {[type]}   loginFunc 登录函数
 * @param  {Function} callback  回调函数
 */
module.exports.setup = function (app, loginFunc, callback) {
  // 用户名密码 登录策略
  passport.use(
    new LocalStrategy(function (username, password, done) {
      if (!loginFunc) return done("登录验证函数未设置");

      loginFunc(username, password, function (err, user) {
        if (err) return done(err);
        return done(null, user);
      });
    })
  );

  // token 验证策略
  passport.use(
    new Strategy(function (token, done) {
      jwt.verify(token, jwt_config.get("secretKey"), function (err, decode) {
        if (err) {
          return done("验证错误");
        }
        return done(null, decode);
      });
    })
  );

  // 初始化passport模块
  app.use(passport.initialize());

  if (callback) callback();
};

/**
 * 登录验证逻辑
 *
 * @param  {[type]}   req  请求
 * @param  {[type]}   res  响应
 * @param  {Function} next [description]
 */
module.exports.login = function (req, res, next) {
  passport.authenticate("local", function (err, user, info) {
    if (err) return res.sendResult(null, 400, err);
    if (!user) return res.sendResult(null, 400, "参数错误");

    // 获取角色信息
    var token = jwt.sign(
      { uid: user.id, rid: user.rid },
      jwt_config.get("secretKey"),
      { expiresIn: jwt_config.get("expiresIn") }
    );
	
    user.token = "Bearer " + token;
    return res.sendResult(user, 200, "登录成功");
  })(req, res, next);
};

/**
 * token验证函数
 *
 * @param  {[type]}   req  请求对象
 * @param  {[type]}   res  响应对象
 * @param  {Function} next 传递事件函数
 */
module.exports.tokenAuth = function (req, res, next) {
  passport.authenticate(
    "bearer",
    { session: false },
    function (err, tokenData) {
      if (err) return res.sendResult(null, 400, "无效token");
      if (!tokenData) return res.sendResult(null, 400, "无效token");
      req.userInfo = {};
      req.userInfo.uid = tokenData["uid"];
      req.userInfo.rid = tokenData["rid"];
      next();
    }
  )(req, res, next);
};
